home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Atari Compendium
/
The Atari Compendium (Toad Computers) (1994).iso
/
files
/
umich
/
tex
/
td187src.lzh
/
BEZIER.I
< prev
next >
Wrap
Text File
|
1991-12-14
|
27KB
|
688 lines
IMPLEMENTATION MODULE Bezier ;
IMPORT mtAppl ;
IMPORT Diverses ;
IMPORT MagicAES ;
IMPORT MagicVDI ;
IMPORT MagicSys ;
IMPORT MathLib0 ;
IMPORT MagicConvert;
IMPORT Variablen ;
IMPORT CommonData;
IMPORT HelpModule;
IMPORT Undo;
FROM OwnBoxes IMPORT WaitForDepress, MousePos;
FROM Types IMPORT TextPosTyp, DrawObjectTyp, CodeAryTyp, ObjectPtrTyp;
FROM BezierCurve IMPORT ComputeBezier;
CONST MaxBezPts = 1000;
VAR BezierArray : ARRAY [0..2*MaxBezPts+1] OF INTEGER;
LastMaxX, LastMaxY : INTEGER; (* Um Ausmaße bestimmen zu können *)
LastMinX, LastMinY : INTEGER;
(**
PROCEDURE Max(i1, i2 : INTEGER) : INTEGER;
BEGIN
IF i1>i2 THEN
RETURN i1;
ELSE
RETURN i2;
END;
END Max;
PROCEDURE Min(i1, i2 : INTEGER) : INTEGER;
BEGIN
IF i1>i2 THEN
RETURN i2;
ELSE
RETURN i1;
END;
END Min;
**)
PROCEDURE PrepareDraw;
(* Draw-Modus = XOR, Mouse Off, Clipping off *)
VAR dum : INTEGER;
BEGIN
dum := MagicVDI.SetWritemode ( mtAppl.VDIHandle , MagicVDI.XOR ) ;
MagicVDI.SetClipping ( mtAppl.VDIHandle , CommonData.ClipXY , TRUE) ;
IF CommonData.ShowBezLine THEN
dum := MagicVDI.SetLinewidth(mtAppl.VDIHandle, CommonData.LineWidth);
ELSE
dum := MagicVDI.SetMarkertype(mtAppl.VDIHandle, MagicVDI.Point);
dum := MagicVDI.SetMarkerheight(mtAppl.VDIHandle, 11 * CommonData.LineWidth);
END;
Diverses.MouseOff;
END PrepareDraw;
PROCEDURE FinishDraw;
(* Draw-Modus = Replace, Mouse On, Clipping off *)
VAR dum : INTEGER;
BEGIN
dum := MagicVDI.SetWritemode ( mtAppl.VDIHandle , MagicVDI.REPLACE ) ;
IF CommonData.ShowBezLine THEN
dum := MagicVDI.SetLinewidth(mtAppl.VDIHandle, CommonData.LineWidth);
ELSE
dum := MagicVDI.SetMarkertype(mtAppl.VDIHandle, MagicVDI.Point);
dum := MagicVDI.SetMarkerheight(mtAppl.VDIHandle, 1 * 11);
END;
MagicVDI.SetClipping ( mtAppl.VDIHandle , CommonData.ClipXY , FALSE) ;
Diverses.MouseOn;
END FinishDraw;
PROCEDURE BezierCurve();
VAR cx, cx2, sx1, sx2, cy, cy2, sy1, sy2, lastx, lasty : INTEGER;
Points, x , y , dum, picx, picy : INTEGER ;
but : BITSET;
lbut, rbut : BOOLEAN;
SurroundRect : ARRAY [0..3] OF INTEGER;
xy : CodeAryTyp ;
pkte : ARRAY [0..5] OF INTEGER;
i, pos : INTEGER;
string : ARRAY [0..9] OF CHAR;
FixEndPt,
FixCtrlPt,
helptxt : ARRAY [0..49] OF CHAR;
BEGIN
(* Zunächst den Startpunkt, dann wie bei Line den 2. Punkt holen und
zum Schluß den dritten Punkt *)
WaitForDepress(sx1, sy1);
pkte[0] := sx1;
pkte[2] := sx1;
pkte[1] := sy1;
pkte[3] := sy1;
FOR i:=0 TO 3 DO BezierArray[i] := pkte[i]; END;
MagicVDI.SetLineEndstyles ( mtAppl.VDIHandle , MagicVDI.Cornerd , MagicVDI.Cornerd ) ;
dum := MagicVDI.SetLinetype ( mtAppl.VDIHandle , MagicVDI.Line ) ;
dum := MagicVDI.SetLinecolor ( mtAppl.VDIHandle , MagicAES.BLACK ) ;
lastx := sx1; lasty := sy1;
Diverses.GetHelpText(1, FixEndPt);
HelpModule.HelpMessage(FixEndPt);
(* Jetzt der 2. Stützpunkt *)
REPEAT
MousePos (sx2, sy2, picx, picy, lbut, rbut);
Variablen.Position ( TRUE, sx2, sy2, sx1, sy1 ) ;
IF (sx2<>sx1) OR (sy2<>sy1) THEN
IF (sx2<>lastx) OR (sy2<>lasty) THEN (* Flackern vermeiden *)
PrepareDraw; (* Bereite Ausgabe vor *)
dum := MagicVDI.SetLinewidth ( mtAppl.VDIHandle , 1 ) ;
MagicVDI.Polyline ( mtAppl.VDIHandle , 2 , BezierArray ) ;
ComputeBezier(BezierArray, 1, sx1, sy1, sx1, sy1,
pkte[2], pkte[3], LastMinX, LastMinY,
LastMaxX, LastMaxY);
pkte[2] := sx2; pkte[3] := sy2;
MagicVDI.Polyline ( mtAppl.VDIHandle , 2 , BezierArray ) ;
FinishDraw; (* Zeichnung beendet *)
END;
END;
lastx := sx2; lasty := sy2;
UNTIL lbut OR rbut;
PrepareDraw; (* Bereite Ausgabe vor *)
dum := MagicVDI.SetLinewidth ( mtAppl.VDIHandle , 1 ) ;
MagicVDI.Polyline ( mtAppl.VDIHandle , 2 , BezierArray ) ;
FinishDraw; (* Zeichnung beendet *)
IF lbut AND NOT rbut THEN
(* Warten bis Maus losgelassen *)
REPEAT
MousePos(cx, cy, picx, picy, lbut, rbut);
UNTIL NOT (lbut OR rbut);
lastx := cx;
lasty := cy;
IF (sx2<sx1) THEN
dum := sx2; sx2 := sx1; sx1 := dum;
dum := sy2; sy2 := sy1; sy1 := dum;
END;
ComputeBezier(BezierArray, 20, sx1, sy1, cx, cy, sx2, sy2,
LastMinX, LastMinY, LastMaxX, LastMaxY);
pkte[4] := pkte[2];
pkte[5] := pkte[3];
pkte[2] := cx;
pkte[3] := cy;
PrepareDraw; (* Bereite Ausgabe vor *)
dum := MagicVDI.SetLinewidth ( mtAppl.VDIHandle , CommonData.LineWidth ) ;
MagicVDI.Polyline ( mtAppl.VDIHandle , 21 , BezierArray ) ;
dum := MagicVDI.SetLinewidth ( mtAppl.VDIHandle , 1 ) ;
MagicVDI.Polyline ( mtAppl.VDIHandle , 3 , pkte ) ;
FinishDraw; (* Zeichnung beendet *)
Diverses.GetHelpText(2, FixCtrlPt);
HelpModule.HelpMessage(FixCtrlPt);
(* Und nun der Kontrollpunkt *)
REPEAT
MousePos ( cx, cy, picx, picy, lbut, rbut );
Variablen.Position (TRUE, cx, cy, sx1, sy1 ) ;
IF (cx<>sx2) OR (cy<>sy2) THEN
IF (cx<>lastx) OR (cy<>lasty) THEN
PrepareDraw; (* Bereite Ausgabe vor *)
dum := MagicVDI.SetLinewidth ( mtAppl.VDIHandle , 1 ) ;
MagicVDI.Polyline ( mtAppl.VDIHandle , 3 , pkte ) ;
dum := MagicVDI.SetLinewidth ( mtAppl.VDIHandle , CommonData.LineWidth ) ;
MagicVDI.Polyline ( mtAppl.VDIHandle , 21 , BezierArray ) ;
pkte[2] := cx; pkte[3] := cy;
ComputeBezier(BezierArray, 20, sx1, sy1, cx, cy, sx2, sy2,
LastMinX, LastMinY, LastMaxX, LastMaxY);
dum := MagicVDI.SetLinewidth ( mtAppl.VDIHandle , CommonData.LineWidth ) ;
MagicVDI.Polyline ( mtAppl.VDIHandle , 21 , BezierArray ) ;
dum := MagicVDI.SetLinewidth ( mtAppl.VDIHandle , 1 ) ;
MagicVDI.Polyline ( mtAppl.VDIHandle , 3 , pkte ) ;
FinishDraw; (* Zeichnung beendet *)
END;
END;
lastx := cx; lasty := cy;
UNTIL (lbut OR rbut);
PrepareDraw; (* Bereite Ausgabe vor *)
dum := MagicVDI.SetWritemode ( mtAppl.VDIHandle , MagicVDI.XOR ) ;
dum := MagicVDI.SetLinewidth ( mtAppl.VDIHandle , 1 ) ;
MagicVDI.Polyline ( mtAppl.VDIHandle , 3 , pkte ) ;
dum := MagicVDI.SetLinewidth ( mtAppl.VDIHandle , CommonData.LineWidth ) ;
MagicVDI.Polyline ( mtAppl.VDIHandle , 21 , BezierArray ) ;
FinishDraw; (* Zeichnung beendet *)
WaitForDepress(lastx, lasty);
IF (lbut) AND NOT (rbut) THEN
Diverses.GetHelpText(5, helptxt);
pos := 0;
WHILE (helptxt[pos]<>'?') DO
INC(pos);
END;
Points := 50;
REPEAT
MousePos(lastx, lasty, picx, picy, lbut, rbut);
UNTIL NOT (lbut OR rbut);
MagicVDI.Text ( mtAppl.VDIHandle ,
CommonData.DYPosx ,
CommonData.DYPosy , ' ' ) ;
PrepareDraw; (* Bereite Ausgabe vor *)
ComputeBezier(BezierArray, Points, sx1, sy1, cx, cy, sx2, sy2,
LastMinX, LastMinY, LastMaxX, LastMaxY);
IF CommonData.ShowBezLine THEN
dum := MagicVDI.SetLinewidth ( mtAppl.VDIHandle , CommonData.LineWidth ) ;
MagicVDI.Polyline ( mtAppl.VDIHandle , Points + 1 , BezierArray ) ;
ELSE
MagicVDI.Polymarker ( mtAppl.VDIHandle , Points + 1 , BezierArray ) ;
END;
FinishDraw; (* Zeichnung beendet *)
MagicConvert.IntToStr(Points, 5, string);
FOR i:= 0 TO 4 DO
helptxt[pos+i] := string[i];
END;
MagicVDI.Text ( mtAppl.VDIHandle ,
CommonData.DXPosx ,
CommonData.DXPosy , string ) ;
HelpModule.HelpMessage(helptxt);
REPEAT
MousePos(cx2, cy2, picx, picy, lbut, rbut);
IF (cx2<>lastx) THEN
(* Bei g